package com.bit.cfdi.web.vm.clientes;

import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.zkoss.bind.BindUtils;
import org.zkoss.bind.annotation.BindingParam;
import org.zkoss.bind.annotation.Command;
import org.zkoss.bind.annotation.ContextParam;
import org.zkoss.bind.annotation.ContextType;
import org.zkoss.bind.annotation.GlobalCommand;
import org.zkoss.bind.annotation.Init;
import org.zkoss.bind.annotation.NotifyChange;
import org.zkoss.zk.ui.Execution;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zk.ui.select.annotation.VariableResolver;
import org.zkoss.zk.ui.select.annotation.Wire;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Filedownload;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Window;

import com.bit.cfdi.web.constants.CFDIConstants;
import com.bit.cfdi.web.domain.Cliente;
import com.bit.cfdi.web.domain.Contacto;
import com.bit.cfdi.web.domain.DatosFiscales;
import com.bit.cfdi.web.domain.Direccion;
import com.bit.cfdi.web.domain.Email;
import com.bit.cfdi.web.domain.Estado;
import com.bit.cfdi.web.domain.Negocio;
import com.bit.cfdi.web.domain.Pais;
import com.bit.cfdi.web.domain.Persona;
import com.bit.cfdi.web.domain.Telefono;
import com.bit.cfdi.web.services.ClienteService;
import com.bit.cfdi.web.services.ContactoService;
import com.bit.cfdi.web.services.DatosFiscalesService;
import com.bit.cfdi.web.services.DireccionService;
import com.bit.cfdi.web.services.EmailService;
import com.bit.cfdi.web.services.EstadoService;
import com.bit.cfdi.web.services.NegocioGiroService;
import com.bit.cfdi.web.services.PaisService;
import com.bit.cfdi.web.services.PersonaService;
import com.bit.cfdi.web.services.TelefonoService;
import com.bit.cfdi.web.services.UsuarioService;
import com.bit.cfdi.web.session.SessionUtils;

@VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class)
public class ClientesViewModel {
	
	private static final long serialVersionUID = 3893823493588699784L;
	private Logger log = LogManager.getLogger(this.getClass().getName());
	@WireVariable private SessionUtils sessionUtils;
	@WireVariable private PaisService paisService;
	@WireVariable private EstadoService estadoService;
	@WireVariable private ClienteService clienteService;
	@WireVariable private UsuarioService usuarioService;
	@WireVariable private DatosFiscalesService datosFiscalesService;
	@WireVariable private ContactoService contactoService;
	@WireVariable private EmailService emailService;
	@WireVariable private TelefonoService telefonoService;
	@WireVariable private PersonaService personaService;
	@WireVariable private DireccionService direccionService;
	@WireVariable private NegocioGiroService negocioGiroService;
	
	
	private Cliente cliente;
	private Cliente queryToClient;
	private Cliente selectedClient;
	
	private DatosFiscales datosFiscales;
	private Direccion direccionEnvio;
	private Direccion datosPersonalesFiscales;
	private Contacto contacto;
	private String direccionCliente;
	private String nombreCliente;
	private String direccionEnvioString;
	private String telefonos;
	private String emails;
	private String direccionFiscal;
	
	private boolean shippingAddress;
	private boolean includeShippingAddress;	
	private boolean rfcValid;
	private boolean razonSocialValid;
	private boolean paisValid;
	private boolean ciudadValid;
	private boolean nuevoClienteVisible;
	private boolean codigoPostalValid;
	private String rfcInvalidMessage;
	private String razonSocialInvalidMessage;
	private String paisInvalidMessage;
	private String ciudadInvalidMessage;
	private String selectedCountry;
	private String codigoPostalInvalidMessage;
	private String direccionEnvioCliente;

	private List<Email> emailList;
	private List<Telefono> phoneList;
	@Wire private Combobox cPais;
	@Wire private Combobox cCiudad;
	private boolean goAway;
	private boolean showCustomerDetails;
	private boolean showNewCustomerForm;
	private boolean editCustomerData;

	private List<Pais> paises = new ArrayList<Pais>();
	private List<Estado> estados = new ArrayList<Estado>();
	private List<Cliente> clientes;
	private String textToSearch;
	private List<Cliente> resultListFromSearch = null;
	
	private Calendar initDate;
	private Calendar finalDate;
	
	private String comprasTotales= "N/A";
	private String notas = "N/A";
	private String facturas = "N/A";
	private String compraPromedio = "N/A";
	
	private String mostPurchasedItem1 = "N/A";
	private String mostPurchasedItem2 = "N/A";
	private String mostPurchasedItem3 = "N/A";
	private String mostPurchasedItem4 = "N/A";
	private String mostPurchasedItem5 = "N/A";
	private String mostPurchasedItem6 = "N/A";
	
	
	@Init
	public void init(@ContextParam(ContextType.EXECUTION) Execution exe) {
		@SuppressWarnings("unchecked")
		Map<String, Object> args = (Map<String, Object>) exe.getArg();
		log.info("INIT");
		initObjects();
	}

	@Command
	@NotifyChange("*")
	public void findCustomers() {
		if (textToSearch != null && !textToSearch.isEmpty()) {
			resultListFromSearch = clienteService.searchCustumersByAllFields(
					(Negocio) sessionUtils.getFromSession(SessionUtils.NEGOCIO), textToSearch);
			if (resultListFromSearch != null && !resultListFromSearch.isEmpty()) {
				clientes = resultListFromSearch;
			}
		} else {
			loadClients();
		}
	}
	
	@NotifyChange("*")
	private void loadClients() {
		clientes = 
				clienteService.getAllfromNegocio(
						(Negocio)sessionUtils.getFromSession(SessionUtils.NEGOCIO));
		if (clientes != null && !clientes.isEmpty()) {
			selectedClient = clientes.get(0);
			cliente.getDatosFiscales().getRfc();
			cliente.getDatosFiscales().getRazon();
			
			nombreCliente += cliente.getPersona().getNombre();
			nombreCliente += cliente.getPersona().getApellidoPaterno();
			nombreCliente += cliente.getPersona().getApellidoMaterno();
			
			cliente.getDatosFiscales().getDireccion().getFullAddress();
		}
	}

	@Command
	public void performExcelExportation() {
		Messagebox.show("¿Deséa exportar los clientes a un archivo de excel?","Question",
				Messagebox.OK | Messagebox.CANCEL, Messagebox.QUESTION, new EventListener<Event>() {
					@Override public void onEvent(Event event) throws Exception {
						if (((Integer) event.getData()).intValue() == Messagebox.OK) {
							BindUtils.postGlobalCommand(null, null, "performCustomerExportation", null);
							return;
						}
					}
				});
		
	}
	
	@GlobalCommand
	public void performCustomerExportation() {
		try {
			String path = "clientes.xls";
			FileOutputStream out = new FileOutputStream(path);
			Workbook wb = new HSSFWorkbook();
			Sheet s = wb.createSheet();
			Row r = null;
			Cell c = null;
			int row = 0;
			r = s.createRow(row);
			c = r.createCell(0);
			c.setCellValue("RFC");
			c = r.createCell(1);
			c.setCellValue("Razón Social");
			c = r.createCell(2);
			c.setCellValue("Nombre");
			c = r.createCell(3);
			c.setCellValue("Emails");
			c = r.createCell(4);
			c.setCellValue("Teléfonos");
			c = r.createCell(5);
			c.setCellValue("Dirección Fiscal");
			c = r.createCell(6);
			c.setCellValue("Dirección Envio");
			row++;
			for (Cliente cliente : clientes) {
				String customerName = cliente.getPersona().getNombre() + " " + cliente.getPersona().getApellidoPaterno() + " " +
										cliente.getPersona().getApellidoMaterno();
				r = s.createRow(row);
				c = r.createCell(row);
				c = r.createCell(0);
				c.setCellValue(cliente.getDatosFiscales().getRfc());
				c = r.createCell(1);				
				c.setCellValue(cliente.getDatosFiscales().getRazon());
				c = r.createCell(2);
				c.setCellValue(customerName);
				c = r.createCell(3);
				c.setCellValue(cliente.getPersona().getContacto().getEmailString());
				c = r.createCell(4);
				c.setCellValue(cliente.getPersona().getContacto().getTelefonoString());
				c = r.createCell(5);
				c.setCellValue(cliente.getDatosFiscales().getDireccion().getFullAddress());
				c = r.createCell(6);
				c.setCellValue(cliente.getDireccionEnvio().getFullAddress());
				row ++;
			}
			wb.write(out);
			out.close();
			File file = new File(path);
			Filedownload.save(file, null);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	
	@Command
	@NotifyChange("*")
	public void getUserData() {
 		if (selectedClient != null ) {
			 Cliente cliente = clienteService.getClienteByNegocioAndRFC(
					((Negocio) sessionUtils.getFromSession(
							SessionUtils.NEGOCIO)).getIdNegocio(),
							selectedClient.getDatosFiscales().getRfc());
			 if (cliente != null) {
				 queryToClient = cliente;
				 showCustomerDetails = true;
				 showNewCustomerForm = false;
			}
		}
	}

	@Command
	@NotifyChange("*")
	public void saveOrUpdateNewClient() {
		Negocio  negocio = (Negocio) sessionUtils.getFromSession(SessionUtils.NEGOCIO);
		if (negocio != null) {
			List<Cliente> customer =  clienteService.searchClienteRFCRazon(
					negocio, cliente.getDatosFiscales().getRfc(), cliente.getDatosFiscales().getRazon());
			if (!editCustomerData) {
				if ((customer != null && customer.isEmpty())) {
					isRfcValid();
					isRazonSocialValid();
					isPaisValid();
					isCiudadValid();
					isCodigoPostalValid();
					if (goAway) {
						DatosFiscales dFiscales = new DatosFiscales();
						Direccion direccion = new Direccion();
						direccion = cliente.getDatosFiscales().getDireccion();
						direccionService.save(direccion);
						dFiscales = cliente.getDatosFiscales();
						dFiscales.setDireccion(direccion);
						datosFiscalesService.save(dFiscales);

						Persona persona = new Persona();
						persona = cliente.getPersona();
						Contacto contact = new Contacto();					
						for (Telefono telefono : getPhoneList()) {
							telefono.setContacto(contact);
							telefonoService.save(telefono);
							contact.getTelefonos().add(telefono);
						}

						for (Email email : getEmailList()) {
							email.setContacto(contact);
							emailService.save(email);
							contact.getEmails().add(email);
						}

						contactoService.save(contact);
						persona.setContacto(contact);
						personaService.save(persona);

						Cliente cliente = new Cliente();
						cliente.setDatosFiscales(dFiscales);
						cliente.setPersona(persona);

						Direccion direccionEnvio = new Direccion();
						direccionEnvio = this.cliente.getDireccionEnvio();
						direccionService.save(direccionEnvio);
						cliente.setDireccionEnvio(direccionEnvio);
						cliente.setNegocio(negocio);

						clienteService.save(cliente);
					}
				} else {
					Messagebox.show("ya existe un usuario registrado con los mismos datos");
					goAway = false;
				}				
			} else {
				clienteService.save(cliente);
				Messagebox.show("Se ha actualizado correctamente la información del cliente");
				clientes.clear();
				editCustomerData = false;
			}
		}
		initObjects();
	}

	private void initObjects() {
		cliente = new Cliente();
		datosFiscales = new DatosFiscales();
		datosFiscales.setDireccion(new Direccion());
		cliente.setDatosFiscales(datosFiscales);
		
		Persona persona = new Persona();
		Contacto contactos = new Contacto();
		contactos.setEmails(new HashSet<Email>());
		contactos.setTelefonos(new HashSet<Telefono>());
		persona.setContacto(contactos);
		cliente.setPersona(persona);

		direccionEnvio = new Direccion();
		cliente.setDireccionEnvio(direccionEnvio);
		
		emailList = new ArrayList<Email>();
		phoneList = new ArrayList<Telefono>();
		setShippingAddress(false);
		setIncludeShippingAddress(false);

		paises = paisService.getAll();
		goAway = false;
		loadClients();
		getUserData();
	}

	@Command
	public void performQueryTotalSalesInTimeByCategory(@BindingParam("category") String value) {
			if (value != null && !value.isEmpty()) {
				
				Calendar from = Calendar.getInstance();
				Calendar since = Calendar.getInstance();

				if (value.equals(Cliente.ONE_DAY_STRING)) {
					since.add(Calendar.DAY_OF_MONTH, -1);
				}
				
				else if (value.equals(Cliente.ONE_WEEK_STRING)) {
					since.add(Calendar.DAY_OF_MONTH, -7);
				}
				
				else if (value.equals(Cliente.FIFTEEN_DAYS_STRING)) {
					since.add(Calendar.DAY_OF_MONTH, -15);
				}
				
				else if (value.equals(Cliente.ONE_MONTH_STRING)) {
					since.add(Calendar.MONTH, -1);
				}
				
				else if (value.equals(Cliente.THREE_MONTHS_STRING)) {
					since.add(Calendar.MONTH, -3);
				}
				
				else if (value.equals(Cliente.SIX_MONTHS_STRING)) {
					since.add(Calendar.MONTH, -6);
				} else {
					since.add(Calendar.YEAR, -1);
				}
								
				Map <Long, Double> sales =
						 clienteService.getTotalSalesInTimeByCategory(selectedClient, value, from, since);
				 if (sales != null && !sales.isEmpty()) {
					 Collection <Double> collection = sales.values();
					 Iterator <Double> iterator = collection.iterator();
					 for (Double double1 : collection) {

					}
				}

				 List<Long> purchasedItems = clienteService.getMostPurchasedItemsInTime(selectedClient, from, since);
				 if (purchasedItems != null && !purchasedItems.isEmpty()) {
					for (Long long1 : purchasedItems) {
						
					}
				}
			}
	}
	
	
	@Command
	public void deleteSelectedItem() {
		Messagebox.show("¿Está seguro de eliminar este cliente?","Question",
				Messagebox.OK | Messagebox.CANCEL, Messagebox.QUESTION, new EventListener<Event>() {
					@Override public void onEvent(Event event) throws Exception {
						if (((Integer) event.getData()).intValue() == Messagebox.OK) {
							BindUtils.postGlobalCommand(null, null, "performCustomerDelete", null);
							return;
						}
					}
				});
	}
	
	@GlobalCommand
	@NotifyChange({"clientes", "selectedClient"} )
	public void performCustomerDelete() {
		clienteService.delete(selectedClient);
		Messagebox.show("El cliente se ha eliminado correctamente");
		clientes.remove(selectedClient);
	}
	
	@Command
	@NotifyChange("*")
	public void editSelectedItem() {
		editCustomerData = true;
		showNewCustomerForm = true;
		showCustomerDetails = false;
		cliente = selectedClient;
	}
	
	@Command
	@NotifyChange({"*"})
	public void shippingAddress() {
		if (shippingAddress) {
			cliente.getDireccionEnvio().setCalle(
					cliente.getDatosFiscales().getDireccion().getCalle());
			cliente.getDireccionEnvio().setCiudad(
					cliente.getDatosFiscales().getDireccion().getCiudad());
			cliente.getDireccionEnvio().setCodigoPostal(
					cliente.getDatosFiscales().getDireccion().getCodigoPostal());
			cliente.getDireccionEnvio().setColonia(
					cliente.getDatosFiscales().getDireccion().getColonia());
			cliente.getDireccionEnvio().setEstado(
					cliente.getDatosFiscales().getDireccion().getEstado());
			cliente.getDireccionEnvio().setLocalidad(
					cliente.getDatosFiscales().getDireccion().getLocalidad());
			cliente.getDireccionEnvio().setMunicipio(
					cliente.getDatosFiscales().getDireccion().getMunicipio());
			cliente.getDireccionEnvio().setNoExterior(
					cliente.getDatosFiscales().getDireccion().getNoExterior());
			cliente.getDireccionEnvio().setNoInterior(
					cliente.getDatosFiscales().getDireccion().getNoInterior());
			cliente.getDireccionEnvio().setPais(
					cliente.getDatosFiscales().getDireccion().getPais());
			cliente.getDireccionEnvio().setReferencia(
					cliente.getDatosFiscales().getDireccion().getReferencia());
		} else {
			cliente.getDireccionEnvio().setCalle(null);
			cliente.getDireccionEnvio().setCiudad(null);
			cliente.getDireccionEnvio().setCodigoPostal(null);
			cliente.getDireccionEnvio().setColonia(null);
			cliente.getDireccionEnvio().setEstado(null);
			cliente.getDireccionEnvio().setLocalidad(null);
			cliente.getDireccionEnvio().setMunicipio(null);
			cliente.getDireccionEnvio().setNoExterior(null);
			cliente.getDireccionEnvio().setNoInterior(null);
			cliente.getDireccionEnvio().setPais(null);
			cliente.getDireccionEnvio().setReferencia(null);
		}
	}
	
	@Command
	@NotifyChange({"phoneList"})
	public void addPhone() {
		getPhoneList().add(new Telefono());
	}
	
	@Command
	@NotifyChange({"emailList"})
	public void addEmail() {
		getEmailList().add(new Email());
	}
	
	@Command
	@NotifyChange({"phoneList"})
	public void deletePhone(@BindingParam("telIndex") Integer telIndex) {
		if (phoneList.get(telIndex) != null && !phoneList.isEmpty()) {
			phoneList.remove(telIndex.intValue());
		}
	}
	
	@Command @NotifyChange({"emailList"})
	public void deleteEmail(@BindingParam("emailIndex") Integer emailIndex) {
		if(emailList.get(emailIndex)!=null && !emailList.isEmpty()) {
			emailList.remove(emailIndex.intValue());
		}
	}
	
	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public String getDireccionCliente() {
		return direccionCliente;
	}

	public void setDireccionCliente(String direccionCliente) {
		this.direccionCliente = direccionCliente;
	}

	public String getNombreCliente() {
		return nombreCliente;
	}

	public void setNombreCliente(String nombreCliente) {
		this.nombreCliente = nombreCliente;
	}

	public String getDireccionEnvio() {
		return direccionEnvioString;
	}

	public void setDireccionEnvio(String direccionEnvio) {
		this.direccionEnvioString = direccionEnvio;
	}

	public String getTelefonos() {
		return telefonos;
	}

	public void setTelefonos(String telefonos) {
		this.telefonos = telefonos;
	}

	public String getEmails() {
		return emails;
	}

	public void setEmails(String emails) {
		this.emails = emails;
	}

	public String getDireccionFiscal() {
		return direccionFiscal;
	}

	public void setDireccionFiscal(String direccionFiscal) {
		this.direccionFiscal = direccionFiscal;
	}

	public UsuarioService getUsuarioService() {
		return usuarioService;
	}

	public void setUsuarioService(UsuarioService usuarioService) {
		this.usuarioService = usuarioService;
	}

	public ClienteService getClienteService() {
		return clienteService;
	}

	public void setClienteService(ClienteService clienteService) {
		this.clienteService = clienteService;
	}

	public boolean isShippingAddress() {
		return shippingAddress;
	}

	public void setShippingAddress(boolean shippingAddress) {
		this.shippingAddress = shippingAddress;
	}

	public boolean isIncludeShippingAddress() {
		return includeShippingAddress;
	}

	public void setIncludeShippingAddress(boolean addShippingAddress) {
		this.includeShippingAddress = addShippingAddress;
	}

	public List<Email> getEmailList() {
		return emailList;
	}

	public void setEmailList(List<Email> emailList) {
		this.emailList = emailList;
	}

	public List<Telefono> getPhoneList() {
		return phoneList;
	}

	public void setPhoneList(List<Telefono> phoneList) {
		this.phoneList = phoneList;
	}

	@Command @NotifyChange("rfcInvalidMessage")
	public boolean isRfcValid() {
		String rfc = cliente.getDatosFiscales().getRfc();
		if (rfc != null && !rfc.isEmpty() &&  rfc.matches(CFDIConstants.RFC_PATTERN)) {
			rfcInvalidMessage = "";
			goAway = true;
			return true;
		} else {
			rfcInvalidMessage = "el RFC ingresado es inválido";
			goAway = false;
			return false;
		}
	}

	public void setRfcValid(boolean rfcValid) {
		this.rfcValid = rfcValid;
	}

	public String getRfcInvalidMessage() {
		return rfcInvalidMessage;
	}

	public void setRfcInvalidMessage(String rfcInvalidMessage) {
		this.rfcInvalidMessage = rfcInvalidMessage;
	}

	@Command @NotifyChange("razonSocialInvalidMessage")
	public boolean isRazonSocialValid() {
		String razonSoc = cliente.getDatosFiscales().getRazon();
		if (razonSoc != null && !razonSoc.isEmpty() && 
				razonSoc.matches(CFDIConstants.RAZON_REGEX)) {
			razonSocialInvalidMessage = null;
			goAway = true;
			return true;
		} else {
			razonSocialInvalidMessage = 
					"La razón social que ha ingresado es inválida, por favor ingrese un nombre válido.";
			goAway = false;
			return false;
		}		
	}

	public void setRazonSocialValid(boolean razonSocialValid) {
		this.razonSocialValid = razonSocialValid;
	}

	public String getRazonSocialInvalidMessage() {
		return razonSocialInvalidMessage;
	}

	public void setRazonSocialInvalidMessage(String razonSocialInvalidMessage) {
		this.razonSocialInvalidMessage = razonSocialInvalidMessage;
	}

	@Command @NotifyChange("paisInvalidMessage")
	public boolean isPaisValid() {
		String country = cliente.getDatosFiscales().getDireccion().getPais();
		if (country != null && !country.isEmpty()) {			
			paisInvalidMessage = null;
			goAway = true;
			return true;
		} else {
			paisInvalidMessage = "Por favor especifique el país de origen del cliente.";
			goAway = false;
			return false;
		}
	}

	public void setPaisValid(boolean paisValid) {
		this.paisValid = paisValid;
	}

	@Command @NotifyChange("ciudadInvalidMessage")
	public boolean isCiudadValid() {
		String city = cliente.getDatosFiscales().getDireccion().getCiudad();
		if (city != null && !city.isEmpty()) {
			ciudadInvalidMessage = null;
			goAway = true;
			return true;
		} else {
			ciudadInvalidMessage = 
					"por favor especifique la ciudad de procedencia del cliente.";
			goAway = false;
			return false;
		}
	}

	public void setCiudadValid(boolean ciudadValid) {
		this.ciudadValid = ciudadValid;
	}

	public String getPaisInvalidMessage() {
		return paisInvalidMessage;
	}

	public void setPaisInvalidMessage(String paisInvalidMessage) {
		this.paisInvalidMessage = paisInvalidMessage;
	}

	public String getCiudadInvalidMessage() {
		return ciudadInvalidMessage;
	}

	public void setCiudadInvalidMessage(String ciudadInvalidMessage) {
		this.ciudadInvalidMessage = ciudadInvalidMessage;
	}

	public List<Pais> getPaises() {
		return paises;
	}

	public void setPaises(List<Pais> paises) {
		this.paises = paises;
	}

	public String getSelectedCountry() {
		return selectedCountry;
	}

	public void setSelectedCountry(String selectedCountry) {
		this.selectedCountry = selectedCountry;
	}

	@Command @NotifyChange("estados")
	public List<Estado> getEstados() {
		String country = cliente.getDatosFiscales().getDireccion().getPais();
		estados = estadoService.getEstadosByPais(country);
		return estados;
	}

	public void setEstados(List<Estado> estados) {
		this.estados = estados;
	}
	
	/*--*/
	@Command 
	public void exportFile()
	{		
		Window window =(Window)Executions.createComponents(
			"/home/clientes/modalWindowExportFile.zul", null, null);
		window.doModal();		
	}
	
	public boolean isNuevoClienteVisible() {
		return nuevoClienteVisible;
	}

	public void setNuevoClienteVisible(boolean nuevoClienteVisible) {
		this.nuevoClienteVisible = nuevoClienteVisible;
	}

	@Command
	@NotifyChange("*")
	public boolean isCodigoPostalValid() {
		String cPostal = cliente.getDatosFiscales().getDireccion().getCodigoPostal();
		if (cPostal != null && !cPostal.isEmpty()) {
			goAway =  true;
			codigoPostalInvalidMessage = null;
			return true;
		} else {
			codigoPostalInvalidMessage = "Por favor verifique que el código postal es correcto";
			goAway = false;
			return false;
		}
	}
	
	@Command
	public void editCustomerData() {
		
	}
	/*
	@Listen("onSelect = #clientesListBox")
	public void chooseClient(SelectEvent<?,?> event) {nm
		SelectEvent<?, ?> sEvent = event;
		Listitem selectedItem = (Listitem) ((Listbox) sEvent.getTarget()).getSelectedItem();
		Cliente cl = (Cliente) selectedItem.getValue();
		cl.getIdCliente();
	}
*/

	public void setCodigoPostalValid(boolean codigoPostalValid) {
		this.codigoPostalValid = codigoPostalValid;
	}

	public String getCodigoPostalInvalidMessage() {
		return codigoPostalInvalidMessage;
	}

	public void setCodigoPostanInvalidMessage(String codigoPostanInvalidMessage) {
		this.codigoPostalInvalidMessage = codigoPostanInvalidMessage;
	}

	public List<Cliente> getClientes() {
		return clientes;
	}

	public void setClientes(List<Cliente> clientes) {
		this.clientes = clientes;
	}

	public Cliente getQueryToClient() {
		return queryToClient;
	}

	public void setQueryToClient(Cliente queryToClient) {
		this.queryToClient = queryToClient;
	}

	public Cliente getSelectedClient() {
		return selectedClient;
	}

	public void setSelectedClient(Cliente selectedClient) {
		this.selectedClient = selectedClient;
	}

	public String getDireccionEnvioCliente() {
		return direccionEnvioCliente;
	}

	public void setDireccionEnvioCliente(String direccionEnvioCliente) {
		this.direccionEnvioCliente = direccionEnvioCliente;
	}

	public boolean isShowCustomerDetails() {
		return showCustomerDetails;
	}

	public void setShowCustomerDetails(boolean showCustomerDetails) {
		this.showCustomerDetails = showCustomerDetails;
	}

	@Command
	@NotifyChange("*")
	public boolean showNewCustomerForm() {
		this.showNewCustomerForm = true;
		this.showCustomerDetails = false;
		return showNewCustomerForm;
	}

	public boolean isShowNewCustomerForm() {
		return showNewCustomerForm;
	}

	public void setShowNewCustomerForm(boolean showNewCustomerForm) {
		this.showNewCustomerForm = showNewCustomerForm;
	}

	public String getTextToSearch() {
		return textToSearch;
	}

	public void setTextToSearch(String textToSearch) {
		this.textToSearch = textToSearch;
	}

	public Calendar getInitDate() {
		return initDate;
	}

	public void setInitDate(Calendar initDate) {
		this.initDate = initDate;
	}

	public Calendar getFinalDate() {
		return finalDate;
	}

	public String getNotas() {
		return notas;
	}

	public String getFacturas() {
		return facturas;
	}

	public String getCompraPromedio() {
		return compraPromedio;
	}

	public String getComprasTotales() {
		return comprasTotales;
	}

	public void setComprasTotales(String comprasTotales) {
		this.comprasTotales = comprasTotales;
	}

	public String getMostPurchasedItem1() {
		return mostPurchasedItem1;
	}

	public String getMostPurchasedItem2() {
		return mostPurchasedItem2;
	}

	public String getMostPurchasedItem3() {
		return mostPurchasedItem3;
	}

	public String getMostPurchasedItem4() {
		return mostPurchasedItem4;
	}

	public String getMostPurchasedItem5() {
		return mostPurchasedItem5;
	}

	public String getMostPurchasedItem6() {
		return mostPurchasedItem6;
	}
	
}